package io.zhiller.camerademo.camera.barcode

import android.annotation.SuppressLint
import android.content.Context
import android.widget.Toast
import androidx.camera.core.ImageAnalysis
import androidx.camera.core.ImageProxy
import com.google.mlkit.vision.barcode.BarcodeScannerOptions
import com.google.mlkit.vision.barcode.BarcodeScanning
import com.google.mlkit.vision.barcode.common.Barcode
import com.google.mlkit.vision.common.InputImage

class BarcodeAnalyzer(private val context: Context) : ImageAnalysis.Analyzer {
  // 初始化条形码扫描选项，设置扫描所有类型的条形码格式
  private val options = BarcodeScannerOptions.Builder()
    .setBarcodeFormats(Barcode.FORMAT_ALL_FORMATS)
    .build()

  // 创建条形码扫描客户端，使用上述配置选项
  private val scanner = BarcodeScanning.getClient(options)

  /**
   * 重写analyze方法以处理图像分析
   * 此方法使用条形码扫描器处理图像代理中的图像，以检测和显示条形码信息
   *
   * @param imageProxy 图像代理对象，包含待分析的图像信息
   */
  @SuppressLint("UnsafeOptInUsageError")
  override fun analyze(imageProxy: ImageProxy) {
    // 获取图像代理中的图像，如果存在则进行处理
    imageProxy.image
      ?.let { image ->
        // 使用条形码扫描器处理图像，并添加成功和完成的监听器
        scanner.process(
          InputImage.fromMediaImage(
            image, imageProxy.imageInfo.rotationDegrees
          )
        ).addOnSuccessListener { barcode ->
          // 处理检测到的条形码，将其原始值转换为字符串并显示
          barcode?.takeIf { it.isNotEmpty() }
            ?.mapNotNull { it.rawValue }
            ?.joinToString(",")
            ?.let { Toast.makeText(context, it, Toast.LENGTH_SHORT).show() }
        }.addOnCompleteListener {
          // 无论处理结果如何，最后关闭图像代理
          imageProxy.close()
        }
      }
  }
}